#include "sendPage.h"
#include <string.h>



// 键盘字符布局（你可以根据喜好改）
static const char s_key_layout[SP_KEY_ROWS][SP_KEY_COLS + 1] =
{
    "1234567890>",
    "ABCDEFGHIJ)",
    "KLMNOPQRST-",
    "UVWXYZ     "
};

//----------------- 小工具函数 -----------------//

// 清空键盘区域（屏幕底部两行：y=32~63）
static void SP_ClearKeyboardArea(void)
{
    for (u8 y = SP_KEYBOARD_AREA_Y; y < 64; y++)
    {
        for (u8 x = 0; x < 128; x++)
        {
            OLED_DrawPoint(x, y, 0);  // 清为黑色
        }
    }
}

// 清空第一行区域（y=0~15）
static void SP_ClearInputLineArea(void)
{
    for (u8 y = 0; y < SP_KEY_CHAR_H; y++)   // 0~15
    {
        for (u8 x = 0; x < 128; x++)
        {
            OLED_DrawPoint(x, y, 0);
        }
    }
}

//----------------- 对外接口实现 -----------------//
void SP_InitSPState(struct SP_state * send_page){
	send_page->cur_col = 0;
	send_page->cur_row = 2;
	send_page->kb_top_row = 0;
	send_page->start_index = 0;
	send_page->str[0] = '\0';
}


void SP_InitKeyboard(void)
{
    // 目前不需要额外初始化，保留接口方便以后扩展
}

// 主函数：画键盘 + 选中框
void SP_DrawKeyboard(struct SP_state*	send_page)
{
    // 防止越界：顶部行最多是 2（显示 2 和 3）
    if (send_page->kb_top_row > SP_KEY_ROWS - 2)
        send_page->kb_top_row = SP_KEY_ROWS - 2;
		if (send_page->kb_top_row < 0)
				send_page->kb_top_row = 0;

    // 1. 先清空键盘区域
    SP_ClearKeyboardArea();

    // 2. 画两行键盘
    for (u8 local_row = 0; local_row < 2; local_row++)
    {
        u8 real_row = send_page->kb_top_row + local_row;     // 键盘的真实行号（0~3）

        // 水平居中
        u8 x0 = 0 ;
        u8 x1 = x0 + SP_KEY_CHAR_W + SP_DELTA;
                // 垂直位置：窗口内第 local_row 行（0/1）对应 y=32 或 48
        u8 y0 = SP_KEYBOARD_AREA_Y + local_row * SP_KEY_CHAR_H;
        u8 y1 = y0 + SP_KEY_CHAR_H;

        // 画一整行字符（直接写字符串）
				for (int k = 0 ; k < (u8)strlen(s_key_layout[real_row]) ; k++){
					OLED_ShowChar(x0,y0,s_key_layout[real_row][k],SP_KEY_CHAR_SIZE,1);
					x0 += (SP_KEY_CHAR_W + SP_DELTA);
					x1 += (SP_KEY_CHAR_W + SP_DELTA);
				}
    }

		// 3. 画出选中框
		if (send_page->cur_row == 3 || send_page->cur_row == 2){
			u8 cur_row = send_page->cur_row - 2;
			u8 real_select_row = send_page->kb_top_row + cur_row;
			u8 real_select_col = send_page->cur_col;
			
			u8 x0 = (SP_KEY_CHAR_W + SP_DELTA)*send_page->cur_col;
			u8 y0 = SP_KEYBOARD_AREA_Y + cur_row * SP_KEY_CHAR_H;
			OLED_ShowChar(x0,y0,s_key_layout[real_select_row][real_select_col],SP_KEY_CHAR_SIZE,0);
		}
		
    // 4. 刷新硬件（如果你在别处已经有统一 Refresh，就可以删掉这行）
    OLED_Refresh();
}

// 根据行/列返回对应字符
char SP_GetKeyChar(struct SP_state*	send_page)
{
		u8 cur_row = send_page->cur_row;
		cur_row = cur_row - 2;
		u8 real_select_row = send_page->kb_top_row + cur_row;
		u8 real_select_col = send_page->cur_col;
    if (real_select_row >= SP_KEY_ROWS) return 0;
    if (real_select_col >= SP_KEY_COLS) return 0;

    char ch = s_key_layout[real_select_row][real_select_col];
    if (ch == ' ') return 0;     // 把布局里的空格视为“无键”
    return ch;
}

// 在第一行显示输入字符串的一部分
void SP_ShowInputLine(struct SP_state* send_page)
{
		u16 len = (u16)strlen(send_page->str);
    if (len == 0)
    {
        // 传进来是空指针，就简单清空这一行
        SP_ClearInputLineArea();
        return;
    }

    // 先清空第一行区域
    SP_ClearInputLineArea();

    if (send_page->start_index >= len)
    {
        // 从字符串长度之后开始显示，相当于不显示任何字符
        // 此时只保留“清空”效果
        return;
    }

    // 从 str[start_index] 开始显示
    const char *p = send_page->str + send_page->start_index;
    u16 remain = len - send_page->start_index;

    // 一行最多容纳的字符数：128 像素 / 8 像素每字 = 16
    u8 max_chars = 128 / SP_KEY_CHAR_W;  // =16
    u8 show_chars = (remain > max_chars) ? max_chars : (u8)remain;

    // 拷贝要显示的这段子串到一个小缓冲，确保以 '\0' 结尾
    char buf[17];   // 最多 16 个字符 + 结尾符
    for (u8 i = 0; i < show_chars; i++)
    {
        buf[i] = p[i];
    }
    buf[show_chars] = '\0';

    // 在第一行显示从 start_index 开始的这一段
    OLED_ShowString(0, 0, (u8 *)buf, SP_KEY_CHAR_H, 1);
    // 不在这里刷新，由你外部统一调用 OLED_Refresh() 或 SP_DrawKeyboard()
}

void SP_ShowAll(struct SP_state* send_page){
		SP_DrawKeyboard(send_page);
		SP_ShowInputLine(send_page);
}